<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /**
     * new在执行时会做的四件事情
     * 1.在内存中创建一个新的空对象
     * 2.让this指向这个新的对象
     * 3.执行构造函数中的代码，给这个新对象添加属性和方法
     * 4.返回这个新对象（所以构造函数中不需要Return）
     * @type {Object}
     */
    // 1.使用new 关键字直接创建对象
    var obj = new Object();
    console.log('obj', obj);

    // 2.使用大括号创建对象
    var obj2 = {};
    console.log('obj2', obj2);

    // 3.使用function构造函数(创建模板class)+new创建对象
    function Star(name,age) {
        this.name = name;
        this.age = age;
        this.sing = function () {
            console.log('sing',this);  // 注意这里的this，如果是对象调用，这里的this就是对象
            console.log("Star is singing");
        };
        function f() {
            console.log('f',this);  // 这里自执行函数因为是windows创建构造函数时调用的，所以他的this是指的windows
        };
        f();
    }

    var star = new Star();  // 可以不传，则 name age 默认都为undefined
    console.log('star',star);
    star.sing()

</script>
</body>
</html>